#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

echo -e "${BLUE}===========================================${NC}"
echo -e "${BLUE}      APIViewer 后端启动脚本 (Linux/Mac)${NC}"
echo -e "${BLUE}===========================================${NC}"

# 设置默认值
DEFAULT_HOST="0.0.0.0"
DEFAULT_PORT="8000"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BACKEND_DIR="$SCRIPT_DIR/backend"

HOST="$DEFAULT_HOST"
PORT="$DEFAULT_PORT"
CLEANUP_MODE=false
REINSTALL_MODE=false
MIGRATE_MODE=false
PRODUCTION_MODE=false
CREATE_VENV_MODE=false

# 检查是否在正确的目录
if [ ! -d "$BACKEND_DIR" ]; then
    echo -e "${RED}❌ 错误: 未找到 backend 目录${NC}"
    echo -e "${YELLOW}请确保在项目根目录运行此脚本${NC}"
    exit 1
fi

# 显示帮助信息
show_help() {
    echo "用法: $0 [选项]"
    echo "选项:"
    echo "  --host, -h HOST          设置主机地址 (默认: 0.0.0.0)"
    echo "  --port, -p PORT          设置端口号 (默认: 8000)"
    echo "  --cleanup                清理Python缓存文件"
    echo "  --reinstall              重新安装依赖"
    echo "  --migrate                执行数据库迁移"
    echo "  --production             生产模式运行"
    echo "  --create-venv            创建虚拟环境"
    echo "  --help                   显示此帮助信息"
    echo ""
    echo "示例:"
    echo "  $0                       # 使用默认设置"
    echo "  $0 --host 127.0.0.1      # 只监听本地"
    echo "  $0 --port 9000           # 使用端口9000"
    echo "  $0 --cleanup             # 清理并启动"
    echo "  $0 --migrate             # 执行数据库迁移"
    echo "  $0 --production          # 生产模式运行"
    echo "  $0 --create-venv         # 创建虚拟环境"
    echo "  $0 8080                  # 简化写法，只指定端口"
    echo "  $0 192.168.1.100         # 简化写法，只指定主机"
}

# 验证端口号
validate_port() {
    local port=$1
    if ! [[ "$port" =~ ^[0-9]+$ ]]; then
        echo -e "${RED}❌ 错误: 端口号必须是数字${NC}"
        exit 1
    fi
    
    if [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
        echo -e "${RED}❌ 错误: 端口号必须在 1-65535 范围内${NC}"
        exit 1
    fi
}

# 检查端口是否被占用
check_port() {
    local port=$1
    if command -v lsof >/dev/null 2>&1; then
        if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1; then
            echo -e "${YELLOW}⚠️  警告: 端口 $port 可能正在使用中${NC}"
            echo -e "${YELLOW}如果启动失败，请尝试使用其他端口${NC}"
            echo ""
        fi
    elif command -v netstat >/dev/null 2>&1; then
        if netstat -ln 2>/dev/null | grep -q ":$port "; then
            echo -e "${YELLOW}⚠️  警告: 端口 $port 可能正在使用中${NC}"
            echo -e "${YELLOW}如果启动失败，请尝试使用其他端口${NC}"
            echo ""
        fi
    fi
}

# 解析命令行参数
while [[ $# -gt 0 ]]; do
    case $1 in
        --host|-h)
            HOST="$2"
            shift 2
            ;;
        --port|-p)
            PORT="$2"
            shift 2
            ;;
        --cleanup)
            CLEANUP_MODE=true
            shift
            ;;
        --reinstall)
            REINSTALL_MODE=true
            shift
            ;;
        --migrate)
            MIGRATE_MODE=true
            shift
            ;;
        --production)
            PRODUCTION_MODE=true
            shift
            ;;
        --create-venv)
            CREATE_VENV_MODE=true
            shift
            ;;
        --help)
            show_help
            exit 0
            ;;
        [0-9]*)
            # 如果是数字，当作端口处理
            PORT="$1"
            shift
            ;;
        *.*)
            # 如果包含点，当作主机处理
            HOST="$1"
            shift
            ;;
        *)
            echo -e "${RED}❌ 未知参数: $1${NC}"
            show_help
            exit 1
            ;;
    esac
done

# 验证端口号
validate_port "$PORT"

# 切换到backend目录
cd "$BACKEND_DIR" || {
    echo -e "${RED}❌ 错误: 无法切换到 backend 目录${NC}"
    exit 1
}

# 检查main.py是否存在
if [ ! -f "main.py" ]; then
    echo -e "${RED}❌ 错误: 未找到 main.py 文件${NC}"
    echo -e "${YELLOW}请确保在正确的项目目录中${NC}"
    exit 1
fi

echo -e "${BLUE}📍 启动参数:${NC}"
echo -e "   目录: ${GREEN}$(pwd)${NC}"
echo -e "   主机: ${GREEN}$HOST${NC}"
echo -e "   端口: ${GREEN}$PORT${NC}"
if [ "$PRODUCTION_MODE" = true ]; then
    echo -e "   模式: ${CYAN}🏭 生产模式${NC}"
else
    echo -e "   模式: ${CYAN}🛠️  开发模式${NC}"
fi
echo -e "   后端API: ${GREEN}http://$HOST:$PORT${NC}"
echo -e "   API文档: ${GREEN}http://$HOST:$PORT/docs${NC}"
echo -e "${BLUE}==========================================${NC}"

# 检查端口是否被占用
check_port "$PORT"

# 检查Python是否安装
if ! command -v python3 &> /dev/null && ! command -v python &> /dev/null; then
    echo -e "${RED}❌ 错误: 未找到 Python${NC}"
    echo -e "${YELLOW}请先安装 Python: https://www.python.org/${NC}"
    exit 1
fi

# 确定Python命令
if command -v python3 &> /dev/null; then
    PYTHON_CMD="python3"
    PIP_CMD="pip3"
else
    PYTHON_CMD="python"
    PIP_CMD="pip"
fi

echo -e "${GREEN}✅ Python 版本: $($PYTHON_CMD --version)${NC}"

# 检查pip是否安装
if ! command -v $PIP_CMD &> /dev/null; then
    echo -e "${RED}❌ 错误: 未找到 pip${NC}"
    exit 1
fi

echo -e "${GREEN}✅ pip 版本: $($PIP_CMD --version | cut -d' ' -f2)${NC}"

# 创建虚拟环境模式
if [ "$CREATE_VENV_MODE" = true ]; then
    echo -e "${YELLOW}🔧 创建虚拟环境...${NC}"
    [ -d "venv" ] && rm -rf venv
    $PYTHON_CMD -m venv venv
    if [ $? -ne 0 ]; then
        echo -e "${RED}❌ 虚拟环境创建失败${NC}"
        exit 1
    fi
    echo -e "${GREEN}✅ 虚拟环境创建完成${NC}"
    echo ""
fi

# 检查是否存在虚拟环境并激活
VENV_ACTIVATED=false
if [ -d "venv" ]; then
    echo -e "${GREEN}🔧 激活虚拟环境...${NC}"
    source venv/bin/activate
    VENV_ACTIVATED=true
elif [ -d ".venv" ]; then
    echo -e "${GREEN}🔧 激活虚拟环境...${NC}"
    source .venv/bin/activate
    VENV_ACTIVATED=true
else
    echo -e "${YELLOW}⚠️  未找到虚拟环境，使用系统Python${NC}"
    echo -e "${YELLOW}💡 建议创建虚拟环境: $0 --create-venv${NC}"
    echo ""
fi

# 清理模式
if [ "$CLEANUP_MODE" = true ]; then
    echo -e "${YELLOW}🧹 正在清理Python缓存...${NC}"
    find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
    find . -name "*.pyc" -delete 2>/dev/null || true
    find . -name "*.pyo" -delete 2>/dev/null || true
    echo -e "${GREEN}✅ 清理完成${NC}"
    echo ""
fi

# 重新安装模式
if [ "$REINSTALL_MODE" = true ]; then
    echo -e "${YELLOW}🔄 重新安装依赖...${NC}"
    $PIP_CMD uninstall -y -r requirements.txt >/dev/null 2>&1 || true
fi

# 检查依赖是否安装
if ! $PIP_CMD show fastapi &> /dev/null; then
    echo -e "${YELLOW}⚠️  未找到 fastapi，正在安装依赖...${NC}"
    $PIP_CMD install -r requirements.txt
    if [ $? -ne 0 ]; then
        echo -e "${RED}❌ 依赖安装失败${NC}"
        echo -e "${YELLOW}请检查网络连接和pip配置${NC}"
        exit 1
    fi
    echo -e "${GREEN}✅ 依赖安装完成${NC}"
    echo ""
fi

# 数据库迁移模式
if [ "$MIGRATE_MODE" = true ]; then
    echo -e "${CYAN}🗄️  执行数据库迁移...${NC}"
    if [ -f "alembic.ini" ]; then
        alembic upgrade head
        if [ $? -ne 0 ]; then
            echo -e "${RED}❌ 数据库迁移失败${NC}"
            exit 1
        fi
        echo -e "${GREEN}✅ 数据库迁移完成${NC}"
    elif [ -f "migrate_database.py" ]; then
        $PYTHON_CMD migrate_database.py
        if [ $? -ne 0 ]; then
            echo -e "${RED}❌ 数据库迁移失败${NC}"
            exit 1
        fi
        echo -e "${GREEN}✅ 数据库迁移完成${NC}"
    else
        echo -e "${YELLOW}⚠️  未找到数据库迁移文件${NC}"
    fi
    echo ""
fi

echo -e "${GREEN}🚀 启动后端API服务器...${NC}"
echo -e "${YELLOW}🛑 按 Ctrl+C 停止服务器${NC}"
echo ""

# 设置环境变量
if [ "$PRODUCTION_MODE" = true ]; then
    export ENVIRONMENT="production"
    export DEBUG="false"
else
    export ENVIRONMENT="development"
    export DEBUG="true"
fi

# 启动FastAPI服务器
if [ "$PRODUCTION_MODE" = true ]; then
    $PYTHON_CMD -m uvicorn main:app --host "$HOST" --port "$PORT"
else
    $PYTHON_CMD -m uvicorn main:app --host "$HOST" --port "$PORT" --reload
fi

# 检查启动是否成功
if [ $? -ne 0 ]; then
    echo ""
    echo -e "${RED}❌ 后端服务器启动失败${NC}"
    echo -e "${CYAN}💡 可能的解决方案:${NC}"
    echo -e "   ${YELLOW}1. 检查端口 $PORT 是否被占用${NC}"
    echo -e "   ${YELLOW}2. 尝试使用其他端口: $0 --port 8001${NC}"
    echo -e "   ${YELLOW}3. 清理项目: $0 --cleanup${NC}"
    echo -e "   ${YELLOW}4. 重新安装依赖: $0 --reinstall${NC}"
    echo -e "   ${YELLOW}5. 执行数据库迁移: $0 --migrate${NC}"
    echo -e "   ${YELLOW}6. 创建虚拟环境: $0 --create-venv${NC}"
    exit 1
fi

echo ""
echo -e "${BLUE}后端服务器已关闭${NC}" 